#include <stdio.h>  // 标准输入输出
// #include <unistd.h>                 //
#include "ClientConnectsHandler.h"  // 客户端连接请求处理器
#include "Defines.h"                // 自定义宏
#include "FileScanner.h"            // 文件扫描器
#include "Server.h"                 // 服务器

int main() {
    uint16_t port = 8089;                         // 指定服务器端口
    Server server;                                // 实例化服务器对象
    ClientConnectsHandler clientConnectsHandler;  // 用于处理多客户端连接请求
    if (false == server._initServer(&port)) {
        PrintLine("【main】初始化服务器失败！");
        return -1;
    }
    PrintLine("【main】初始化服务器成功, [%d]", port);

    if (false == server._listen(10)) {
        PrintLine("【main】服务器监听失败！");
        return -1;
    }
    PrintLine("【main】服务器监听成功！");

    // 测试文件扫描器
    std::string rootPath = "/home/youshao/web_file_manager";  // 服务器根目录
    FileScanner fileScanner(rootPath);
    for (int i = 0; i < fileScanner._getFileAttrsLength(); i++) {
        PrintLine("【%d】当前扫描的文件：[%s]", i + 1, fileScanner._getFileNameByIndex(i).c_str());
    }
    PrintLine("已扫描的文件：[%d]", fileScanner._getFileAttrsLength());

    // 接收和处理客户端请求
    while (1) {
        Server::ClientData clientData;
        if (false == server._accept(&clientData)) {
            PrintLine("【main】接受客户端请求失败！");
            continue;
        }
        unsigned char* ip = (unsigned char*)&clientData.clientAddr.sin_addr.s_addr;  // 发来请求的客户端地址
        printf("-------------------------------------------\n");
        PrintLine("【main】接受客户端请求成功, [%d], [%d.%d.%d.%d]", clientData.clientSocket, ip[0], ip[1], ip[2], ip[3]);
        // 处理新的客户端连接请求
        if (false == clientConnectsHandler._addClientConnect(clientData.clientSocket, clientData.clientAddr)) {
            PrintLine("新增客户端连接未成功添加至线程");
        }
        PrintLine("新增客户端连接成功添加至线程");
        // close(clientData.clientSocket);  // 使用多线程后，代码不再简单地顺序执行，而我们需要使用套接字处理器内部决定何时关闭客户端套接字
    }

    return 0;
}